package sistema;

import java.util.ArrayList;
import java.util.List;

import exceptions.BairroInvalidoException;
import exceptions.CEPInvalidoException;
import exceptions.CPFInvalidoException;
import exceptions.EmailInvalidoException;
import exceptions.ListaEnderecoInvalidaException;
import exceptions.LogradouroInvalidoException;
import exceptions.NomeInvalidoException;
import exceptions.NumeroInvalidoException;
import exceptions.SenhaInvalidaException;
import exceptions.TelefoneInvalidoException;
import exceptions.UsernameInvalidoException;

import alugaveis.Alugavel;
import usuarios.Cliente;
import usuarios.Caixa;
import usuarios.Endereco;
import usuarios.Funcionario;

public abstract class Locadora {
	private static List<Alugavel> alugaveis;
	private static List<Funcionario> funcionarios;
	private static List<Cliente> clientes;
	private static Funcionario admin;
	private static List<Caixa> caixas;

	public static void criaAdministrador() throws LogradouroInvalidoException,
			NumeroInvalidoException, BairroInvalidoException,
			CEPInvalidoException, NomeInvalidoException, CPFInvalidoException,
			TelefoneInvalidoException, EmailInvalidoException,
			SenhaInvalidaException, UsernameInvalidoException,
			ListaEnderecoInvalidaException {
		// Instanciamento de Endereco do Administrador
		Endereco enderecoAdmin = new Endereco("R. Treze de Maio", "144",
				"Centro", "69100-103", true);
		List<Endereco> adminEnderecos = new ArrayList<>();
		adminEnderecos.add(enderecoAdmin);

		// Instanciamento do Administrador
		admin = new Funcionario("Cinematic INC", "034.456.544-70", "8345-6643",
				"cinematic.noreply@gmail.com", adminEnderecos, "Admin",
				"cinematic22");
	}

	/**
	 * Cadastra um novo funcionario na Locadora.
	 * 
	 * @return true, se o funcionario foi cadastrado, ou false, caso contrario.
	 */
	public static boolean cadastraFuncionario(Funcionario funcionario) {
		if (!(funcionarios.contains(funcionario))) {
			funcionarios.add(funcionario);
			return true;
		}
		return false;
	}

	/**
	 * Cadastra um Produto alugavel na Locadora.
	 * 
	 * @return true, se o produto foi cadastrado, ou false, caso contrario.
	 */
	public static boolean cadastraProduto(Alugavel produto) {
		if (!(alugaveis.contains(produto)) && produto != null) {
			alugaveis.add(produto);
			return true;
		}
		return false;
	}

	/**
	 * Elimina o cadastro de algum cliente caso seja necessario.
	 */
	public static boolean apagaCadastroCliente(Cliente cliente) {
		if (clientes.contains(cliente)) {
			clientes.remove(cliente);
			return true;
		}
		return false;
	}

	/**
	 * Apaga o cadastro do antigo funcionario em caso de demissao.
	 */
	public static boolean apagaCadastroFuncionario(Funcionario funcionario) {
		if (funcionarios.contains(funcionario)) {
			funcionarios.remove(funcionario);
			return true;
		}
		return false;
	}

	/**
	 * Pesquisa um Produto alugavel na Locadora.
	 * 
	 * @return O produto, se foi encontrado, ou null, caso o produto nao exista.
	 */
	public static Alugavel pesquisaProduto(Alugavel produto) {
		// TODO
		return (Alugavel) null;
	}

	/**
	 * Permite ao Administrador da loja ver o desempenho de cada funcionario ao
	 * longo do mes.
	 */
	public void verEstatisticas() {
		// TODO
	}

}